import time
from mcp_server_graph.llm.agent import BaseAgent

"""
分析智能体，负责汇总用户原始输入和数据查询结果，分析后形成最终的回答。
input:{"user_input": str, "cypher_result": ["vertexs": dict,edges: dict], "purpose": int, "vital_info": str}
output: str
"""

input_json_structure_info='''{"user_input": str, "cypher_result": ("vertexs": dict,edges: dict), "purpose": int, "extra_info": str}
其中，"user_input"表示用户原始输入，"cypher_result"表示基于用户问题cypher查询的结果数据("vertexs"表示实体信息，edges表示关系信息，包括了后处理生成的预测信息)，
"purpose"表示基于用户问题识别的业务场景意图，vital_info表示对"cypher_result"的关键信息提取
'''

purpose_instruction = '''[
    {"id": 0, "name": "人车家", 
    "instruction": """
    处理划归为人车家的"user_input"，"cypher_result"为相关购车用户群体的图谱数据，"vital_info"为对有购车意向用户的信息总结
    """
    },
    {"id": 1, "name": "异网用户发展", 
    "instruction": """
    处理划归为异网用户发展的"user_input"，"cypher_result"为基于"user_input"的查询结果，"vital_info"为异网用户信息的文字说明
    """
    },
    {"id": 2, "name": "群体运营", 
    "instruction": """
    处理划归为群体运营的"user_input"，"cypher_result"为基于"user_input"的查询和推理结果，"vital_info"为
    """
    },
    {"id": 3, "name": "诈骗识别", 
    "instruction": """
    处理划归为诈骗识别的"user_input"，"cypher_result"为基于"user_input"的查询和推理结果，"vital_info"为推理出的诈骗用户实体文字说明
    """
    },
    {"id": 4, "name": "集团产品推荐", 
    "instruction": """
    处理划归为用户细分的"user_input"，"cypher_result"为基于"user_input"的查询和推理结果，"vital_info"为针对集团产品的推理边信息的文字说明（表示未来可进行的营销行为）
    """
    },
    {"id": 5, "name": "其他", 
    "instruction": """
    处理所有无法划归为前述场景的"user_input"，"cypher_result"为相关用户群体的二度关系数据。
    """
    }
] '''

class AnalystAgent(BaseAgent):
    memory = []

    def get_system_prompt(self):
        prompt = f"""
        你是一个数据问答客服专家，擅长分析用户问题、用户意图和相关数据，然后准确高效地回答用户问题。
        请学习【background】部分了解任务背景，严格遵循【requirements】部分的要求，依照【Instruction】按步骤完成任务。

        【background】
        你所服务的系统是结合图计算与大模型的通用性大数据洞察分析和决策辅助系统。
        该系统接入某电信运营商数据仓库，获取大量业务数据并建立以自然人为中心的知识图谱，如用户入网信息、集团订购产品、流量行为、通话行为、宽带办理信息等
        旨在支撑"建设基于用户细分、存增一体的客户全生命周期数智营销平台，构建以“泛家庭”为单位的融合经营体系"战略任务。
        本系统的工作流程为：
        首先调用大模型A对用户原始输入进行细分意图识别，划分到预定义的业务场景，并基于用户输入初步提取相关cypher语句参数；
        然后进入细分场景下预定义的cypher查询模版，输入A提取到的参数，获取与用户问题相关的数据，并通过后处理提取关键信息、生成预测信息；
        最后查询结果和用户原始输入给到大模型B，生成最终的自然语言回答（（这是你所负责的部分））。
        
        
        【Instruction】
        1、接收输入json，其结构为{input_json_structure_info}
        2、接收“user_input”了解用户问题，结合“cypher_result”和”vital_info“分析现有数据情况
        3、根据【requirements】“purpose_instruction”，针对不同业务意图整理回复思路
        4、生成回复内容

        【requirements】
        1、意图选项严格遵循{purpose_instruction}中所示信息，针对每类业务场景意图，从不同侧重点的回复用户问题
        2、以markdown格式进行回复，回复内容要突出重点，言之有理，有数据依据，不要胡编乱造
        3、回复内容为两部分：对用户群特征的洞察分析、针对用户问题和业务场景的回复或建议
        4、回复用户时，不要出现以下内容：意图识别结果、提问性文本、过于详细的策略建议或营销方案、末尾的注解或总结性内容
        """

        return prompt
    
    def analyst_chat(self, input_json, history=None):
        ret=None

        try:
            response = self.complete(input_json,history=history)
            ret=response.choices[0].message.content
        except Exception as e:
            ret = "发生错误，原因为：" + str(e)
        finally:
            return ret
            

    def analyst_chat_stream(self, data, user_prompt, history):
        start_time = time.time()
        response = self.stream_complete(user_prompt, history, self.get_system_prompt().format(str(data)))
        collected_chunks = []
        collected_messages = []
        # 通过事件流迭代
        for chunk in response:
            chunk_time = time.time() - start_time
            collected_chunks.append(chunk)
            chunk_message = chunk.choices[0].delta
            collected_messages.append(chunk_message)
            # print(f"Message received {chunk_time:.2f} seconds after request: {chunk_message}")
            print(chunk.choices[0].delta.content, end='')
        #
        print()

        # 打印完整响应和文本
        full_reply_content = ''.join([m.content for m in collected_messages])
        return full_reply_content


if __name__ == '__main__':
    from mcp_server_graph.utils.graph_service import GraphService
    
    agent = AnalystAgent()
    vertex_set, edge_set, extra_info=GraphService().get_new_customer_recommendation(['U02369'])

    input_json={"user_input": "如何基于北京市高价值用户的社交圈，进行异网用户拉新", 
                "cypher_result":(vertex_set, edge_set),
                "purpose": 4,
                "vital_info": extra_info
                }
    print(agent.analyst_chat(str(input_json)))